﻿using System;
using System.Collections.Generic;
using CTS.Com.Domain.Helper;
using CTS.Data.Domain.Constants;
using CTS.Data.Domain.Entity;
using CTS.Data.MAParameters.Domain.Dao;

namespace CTS.Data.MAParameters.Domain.Utils
{
    /// <summary>
    /// ParameterCom
    /// </summary>
    public class ParameterCom
    {
        private readonly ParameterComDao _comDao;
        public ParameterCom() { _comDao = new ParameterComDao(); }

        /// <summary>
        /// Kiểm tra tồn tại parameter
        /// </summary>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="paramCd">Mã parameter</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>True/False</returns>
        public bool IsExist(string localeCd, string paramCd, bool ignoreDeleteFlag)
        {
            // Trả về true trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(paramCd)) {
                return true;
            }
            // Kết quả trả về
            return _comDao.IsExist(localeCd, paramCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy thông tin parameter
        /// </summary>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="paramCd">Mã parameter</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Thông tin parameter</returns>
        public ParameterInfo GetInfo(string localeCd, string paramCd, bool ignoreDeleteFlag)
        {
            // Trả về null trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(paramCd)) {
                return null;
            }
            // Lấy thông tin
            var dataInfo = _comDao.GetInfo(localeCd, paramCd, ignoreDeleteFlag);
            // Kết quả trả về
            return DataHelper.CopyObject<ParameterInfo>(dataInfo);
        }

        /// <summary>
        /// Lấy danh sách parameter
        /// </summary>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách parameter</returns>
        public IList<ParameterInfo> GetList(bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<ParameterInfo>();
            // Lấy danh sách locale
            var listInfo = _comDao.GetList(ignoreDeleteFlag);
            // Diệt danh sách locale
            foreach (var info in listInfo) {
                listResult.Add(DataHelper.CopyObject<ParameterInfo>(info));
            }
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy loại parameter
        /// </summary>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="paramCd">Mã parameter</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Loại parameter</returns>
        public string GetType(string localeCd, string paramCd, bool ignoreDeleteFlag)
        {
            // Trả về blank trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(paramCd)) {
                return string.Empty;
            }
            // Kết quả trả về
            return _comDao.GetType(localeCd, paramCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy giá trị parameter (String)
        /// </summary>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="paramCd">Mã parameter</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Giá trị parameter</returns>
        public string GetString(string localeCd, string paramCd, bool ignoreDeleteFlag)
        {
            // Trả về blank trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(paramCd)) {
                return string.Empty;
            }
            // Lấy loại parameter
            var type = GetType(localeCd, paramCd, ignoreDeleteFlag);
            // Trả về blank trong trường hợp loại parameter khác chuỗi
            if (type != DataLogics.PT_STRING && type != DataLogics.PT_PASSWORD) {
                return string.Empty;
            }
            // Kết quả trả về
            return _comDao.GetValue(localeCd, paramCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy giá trị parameter (Number)
        /// </summary>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="paramCd">Mã parameter</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Giá trị parameter</returns>
        public decimal? GetNumber(string localeCd, string paramCd, bool ignoreDeleteFlag)
        {
            // Trả về null trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(paramCd)) {
                return null;
            }
            // Lấy loại parameter
            var type = GetType(localeCd, paramCd, ignoreDeleteFlag);
            // Trả về null trong trường hợp loại parameter khác số
            if (type != DataLogics.PT_NUMBER) {
                return null;
            }
            // Lấy giá trị parameter
            var value = _comDao.GetValue(localeCd, paramCd, ignoreDeleteFlag);
            // Kết quả trả về
            return DataHelper.ConvertInputNumber(value);
        }

        /// <summary>
        /// Lấy giá trị parameter (Date)
        /// </summary>
        /// <param name="localeCd">Mã locale</param>
        /// <param name="paramCd">Mã parameter</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Giá trị parameter</returns>
        public DateTime? GetDate(string localeCd, string paramCd, bool ignoreDeleteFlag)
        {
            // Trả về null trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(paramCd)) {
                return null;
            }
            // Lấy loại parameter
            var type = GetType(localeCd, paramCd, ignoreDeleteFlag);
            // Trả về null trong trường hợp loại parameter khác ngày
            if (type != DataLogics.PT_DATE) {
                return null;
            }
            // Lấy giá trị parameter
            var value = _comDao.GetValue(localeCd, paramCd, ignoreDeleteFlag);
            // Kết quả trả về
            return DataHelper.ConvertInputDate(value);
        }
    }
}
